类加载器如何打破双亲委派加载机制(SPI原理) 您所在的位置:网站首页 类加载机制 双亲委派 类加载器如何打破双亲委派加载机制(SPI原理)

类加载器如何打破双亲委派加载机制(SPI原理)

2022-03-27 07:07| 来源: 网络整理| 查看: 265

类加载器命名空间可见性

子类加载器可以见到父类加载器加载的类,而父类加载器看不见子类加载器加载的类

打破双亲委派加载机制

自定义类加载器

基本原理

当前项目中定义好接口,实现类不在当前类路径下。实现类实现当前项目提供的接口。在当前项目中调用自定义classLoder.load().根据双亲委托机制,会先尝试使用父类加载器加载,加载不成功则使用子类加载器。子类加载器加载当前Student1类,需要用到Student接口,而Student接口是使用父类加载器加载的(在类路径下面),由于父类加载器加载的类对于子类可见,则不会报错).拿到反射实例的class后调用反射(此处不能直接new ,直接new或者直接使用Student1都会造成主动使用,从而造成appClassLoder来加载这个类,由于AppclassLoder无法加载这个类,父类加载器无法访问子类加载器加载的类,此时就会报错)。根据预先定义好的接口Student,就可以使用这个具体实现类的某些方法了

image.png

/**

@author: logan @Date: 2019/10/30 13:15 @Description:

*/public class Test01 { public static void main(String[] args)

throws ClassNotFoundException, IllegalAccessException, InstantiationException { //这个类class的路径 String classPath = "C:\\Users\\Administrator\\Desktop\\test\\com\\student\\"; MyClassLoader myClassLoader = new MyClassLoader(classPath, "my"); String packageNamePath = "Student1"; Class a = myClassLoader.loadClass(packageNamePath); System.out.println("类加载器是:" + a.getClassLoader()); Student student = (Student) a.newInstance(); student.doSth();

}}

应用场景

SPI原理:如JDBC等tomaCat:....、当然,他们还依赖上下文Thread.setContextClassLoader()未完待续。。。。。。。。

原文链接:https://segmentfault.com/a/1190000020858126



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有